package com.linran.gclearn.jvm.oom;

import java.util.HashSet;
import java.util.Set;

/**
 * JDK7+由于常量池从JDK6的永久代移到了堆中，所以通过限制堆内存最大大小-Xmx才可实现运行时常量池内存溢出
 */
public class RunTimeConstantPoolOOM {

    public static void main(String[] args) {
        stringIntern();
    }

    public static void constantPoolOOMTest() {
        // 使用Set保持着常量池引用，避免Full GC回收常量池行为
        Set<String> set = new HashSet<>();
        // 在short范围内足以让6MB的PermSize产生OOM了
        short i = 0;
        while (true) {
            set.add(String.valueOf(i++).intern());
        }
    }

    public static void stringIntern() {
        String str1 = new StringBuilder("计算机").append("软件").toString();
        System.out.println(str1.intern().equals(str1));

        String str2 = new StringBuilder("ja").append("va").toString();
        System.out.println(str2.intern().equals(str2));
    }
}
